Otključajte moć GraphQL Federacije pomoću Schema Stitchinga. Naučite kako izgraditi jedinstveni GraphQL API iz više servisa, poboljšavajući skalabilnost i održivost.
GraphQL Federacija: Schema Stitching - Sveobuhvatan Vodič
U neprestano razvijajućem krajoliku modernog razvoja aplikacija, potreba za skalabilnim i održivim arhitekturama postala je ključna. Mikroservisi, sa svojom inherentnom modularnošću i neovisnom mogućnošću postavljanja, pojavili su se kao popularno rješenje. Međutim, upravljanje brojnim mikroservisima može uvesti složenosti, osobito kada je riječ o izlaganju jedinstvenog API-ja klijentskim aplikacijama. Tu na scenu stupa GraphQL Federacija, a posebno Schema Stitching.
Što je GraphQL Federacija?
GraphQL Federacija je moćna arhitektura koja vam omogućuje izgradnju jednog, jedinstvenog GraphQL API-ja iz više temeljnih GraphQL servisa (koji često predstavljaju mikroservise). Omogućuje programerima da dohvaćaju podatke s različitih servisa kao da je riječ o jednom grafu, pojednostavljujući iskustvo klijenta i smanjujući potrebu za složenom logikom orkestracije na klijentskoj strani.
Postoje dva primarna pristupa GraphQL Federaciji:
- Schema Stitching: Ovo uključuje kombiniranje više GraphQL shema u jednu, jedinstvenu shemu na razini gatewaya. To je stariji pristup i oslanja se na biblioteke za upravljanje kombinacijom shema i delegiranjem upita.
- Apollo Federation: Ovo je noviji i robusniji pristup koji koristi deklarativni jezik shema i namjenski planer upita za upravljanje procesom federacije. Nudi napredne značajke poput proširenja tipova, ključnih direktiva i distribuiranog praćenja.
Ovaj članak se fokusira na Schema Stitching, istražujući njegove koncepte, prednosti, ograničenja i praktičnu implementaciju.
Razumijevanje Schema Stitchinga
Schema Stitching je proces spajanja više GraphQL shema u jednu, kohezivnu shemu. Ova jedinstvena shema djeluje kao fasada, skrivajući složenost temeljnih servisa od klijenta. Kada klijent pošalje zahtjev na spojenu shemu, gateway inteligentno usmjerava zahtjev na odgovarajući temeljni servis(e), dohvaća podatke i kombinira rezultate prije nego što ih vrati klijentu.
Zamislite to ovako: Imate više restorana (servisa), od kojih je svaki specijaliziran za različite kuhinje. Schema Stitching je poput univerzalnog jelovnika koji kombinira sva jela iz svakog restorana. Kada kupac (klijent) naruči s univerzalnog jelovnika, narudžba se inteligentno usmjerava u odgovarajuće kuhinje restorana, hrana se priprema, a zatim kombinira u jednu dostavu za kupca.
Ključni koncepti u Schema Stitchingu
- Udaljene sheme (Remote Schemas): Ovo su pojedinačne GraphQL sheme svakog temeljnog servisa. Svaki servis izlaže vlastitu shemu koja definira podatke i operacije koje pruža.
- Gateway: Gateway je središnja komponenta odgovorna za spajanje udaljenih shema i izlaganje jedinstvene sheme klijentu. Prima zahtjeve klijenta, usmjerava ih na odgovarajuće servise i kombinira rezultate.
- Spajanje shema (Schema Merging): Ovo je proces kombiniranja udaljenih shema u jednu shemu. To često uključuje preimenovanje tipova i polja kako bi se izbjegli sukobi i definiranje odnosa između tipova u različitim shemama.
- Delegiranje upita (Query Delegation): Kada klijent pošalje zahtjev na spojenu shemu, gateway mora delegirati zahtjev odgovarajućem temeljnom servisu(ima) kako bi dohvatio podatke. To uključuje prevođenje klijentovog upita u upit koji udaljeni servis može razumjeti.
- Agregacija rezultata (Result Aggregation): Nakon što je gateway dohvatio podatke s temeljnih servisa, mora kombinirati rezultate u jedan odgovor koji se može vratiti klijentu. To često uključuje transformaciju podataka kako bi odgovarali strukturi spojene sheme.
Prednosti Schema Stitchinga
Schema Stitching nudi nekoliko uvjerljivih prednosti za organizacije koje usvajaju arhitekturu mikroservisa:
- Jedinstveni API: Pruža jedan, dosljedan API za klijente, pojednostavljujući pristup podacima i smanjujući potrebu da klijenti izravno komuniciraju s više servisa. To rezultira čišćim i intuitivnijim iskustvom za programere.
- Smanjena složenost klijenta: Klijenti trebaju komunicirati samo s jedinstvenom shemom, što ih štiti od složenosti temeljne arhitekture mikroservisa. To pojednostavljuje razvoj na klijentskoj strani i smanjuje količinu koda potrebnog na klijentu.
- Povećana skalabilnost: Omogućuje neovisno skaliranje pojedinih servisa na temelju njihovih specifičnih potreba. To poboljšava ukupnu skalabilnost i otpornost sustava. Na primjer, servis za korisnike koji doživljava veliko opterećenje može se skalirati bez utjecaja na druge servise poput kataloga proizvoda.
- Poboljšana održivost: Promiče modularnost i odvajanje odgovornosti, što olakšava održavanje i razvoj pojedinih servisa. Promjene na jednom servisu manje će vjerojatno utjecati na druge servise.
- Postupno usvajanje: Može se implementirati inkrementalno, omogućujući vam postupnu migraciju s monolitne arhitekture na arhitekturu mikroservisa. Možete započeti spajanjem postojećih API-ja, a zatim postupno razlagati monolit na manje servise.
Ograničenja Schema Stitchinga
Iako Schema Stitching nudi brojne prednosti, važno je biti svjestan njegovih ograničenja:
- Složenost: Implementacija i upravljanje schema stitchingom može biti složeno, posebno u velikim i složenim sustavima. Pažljivo planiranje i dizajn su ključni.
- Dodatno opterećenje performansi (Performance Overhead): Gateway uvodi određeno dodatno opterećenje performansi zbog dodatnog sloja indirekcije i potrebe za delegiranjem upita i agregacijom rezultata. Pažljiva optimizacija je ključna za minimiziranje ovog opterećenja.
- Sukobi shema: Sukobi se mogu pojaviti prilikom spajanja shema iz različitih servisa, pogotovo ako koriste ista imena tipova ili polja. To zahtijeva pažljiv dizajn shema i potencijalno preimenovanje tipova i polja.
- Ograničene napredne značajke: U usporedbi s Apollo Federacijom, Schema Stitchingu nedostaju neke napredne značajke poput proširenja tipova i ključnih direktiva, što može otežati upravljanje odnosima između tipova u različitim shemama.
- Zrelost alata: Alati i ekosustav oko Schema Stitchinga nisu toliko zreli kao oni oko Apollo Federacije. To može otežati otklanjanje grešaka i rješavanje problema.
Praktična implementacija Schema Stitchinga
Prođimo kroz pojednostavljeni primjer kako implementirati Schema Stitching koristeći Node.js i biblioteku graphql-tools
(popularan izbor za schema stitching). Ovaj primjer uključuje dva mikroservisa: User Service (Servis za korisnike) i Product Service (Servis za proizvode).
1. Definirajte udaljene sheme
Prvo, definirajte GraphQL sheme za svaki od udaljenih servisa.
Servis za korisnike (user-service.js
):
const { buildSchema } = require('graphql');
const userSchema = buildSchema(`
type User {
id: ID!
name: String
email: String
}
type Query {
user(id: ID!): User
}
`);
const users = [
{ id: '1', name: 'Alice Smith', email: 'alice@example.com' },
{ id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];
const userRoot = {
user: (args) => users.find(user => user.id === args.id),
};
module.exports = {
schema: userSchema,
rootValue: userRoot,
};
Servis za proizvode (product-service.js
):
const { buildSchema } = require('graphql');
const productSchema = buildSchema(`
type Product {
id: ID!
name: String
price: Float
userId: ID! # Strani ključ prema servisu za korisnike
}
type Query {
product(id: ID!): Product
}
`);
const products = [
{ id: '101', name: 'Laptop', price: 1200, userId: '1' },
{ id: '102', name: 'Smartphone', price: 800, userId: '2' },
];
const productRoot = {
product: (args) => products.find(product => product.id === args.id),
};
module.exports = {
schema: productSchema,
rootValue: productRoot,
};
2. Kreirajte Gateway servis
Sada, kreirajte gateway servis koji će spojiti dvije sheme zajedno.
Gateway servis (gateway.js
):
const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');
async function createRemoteSchema(uri) {
const fetcher = async (params) => {
const response = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(params),
});
return response.json();
};
const schema = await introspectSchema(fetcher);
return makeRemoteExecutableSchema({
schema,
fetcher,
});
}
async function main() {
const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
const productSchema = await createRemoteSchema('http://localhost:4002/graphql');
const stitchedSchema = stitchSchemas({
subschemas: [
{ schema: userSchema },
{ schema: productSchema },
],
typeDefs: `
extend type Product {
user: User
}
`,
resolvers: {
Product: {
user: {
selectionSet: `{ userId }`,
resolve(product, args, context, info) {
return info.mergeInfo.delegateToSchema({
schema: userSchema,
operation: 'query',
fieldName: 'user',
args: {
id: product.userId,
},
context,
info,
});
},
},
},
},
});
const app = express();
app.use('/graphql', graphqlHTTP({
schema: stitchedSchema,
graphiql: true,
}));
app.listen(4000, () => console.log('Gateway poslužitelj pokrenut na http://localhost:4000/graphql'));
}
main().catch(console.error);
3. Pokrenite servise
Morat ćete pokrenuti Servis za korisnike i Servis za proizvode na različitim portovima. Na primjer:
Servis za korisnike (port 4001):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4001, () => console.log('Servis za korisnike pokrenut na http://localhost:4001/graphql'));
Servis za proizvode (port 4002):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4002, () => console.log('Servis za proizvode pokrenut na http://localhost:4002/graphql'));
4. Postavite upit spojenoj shemi
Sada možete postaviti upit spojenoj shemi putem gatewaya (koji radi na portu 4000). Možete pokrenuti upit poput ovog:
query {
product(id: "101") {
id
name
price
user {
id
name
email
}
}
}
Ovaj upit dohvaća proizvod s ID-jem "101" i također dohvaća povezanog korisnika iz Servisa za korisnike, demonstrirajući kako vam Schema Stitching omogućuje dohvaćanje podataka s više servisa u jednom zahtjevu.
Napredne tehnike Schema Stitchinga
Osim osnovnog primjera, evo nekoliko naprednih tehnika koje se mogu koristiti za poboljšanje vaše implementacije Schema Stitchinga:
- Delegiranje sheme: Ovo vam omogućuje delegiranje dijelova upita različitim servisima na temelju traženih podataka. Na primjer, možete delegirati rješavanje tipa
User
servisu za korisnike, a rješavanje tipaProduct
servisu za proizvode. - Transformacija sheme: Ovo uključuje modificiranje sheme udaljenog servisa prije nego što se spoji u jedinstvenu shemu. To može biti korisno za preimenovanje tipova i polja, dodavanje novih polja ili uklanjanje postojećih polja.
- Prilagođeni resolveri: Možete definirati prilagođene resolvere u gatewayu za obradu složenih transformacija podataka ili za dohvaćanje podataka s više servisa i njihovo kombiniranje u jedan rezultat.
- Dijeljenje konteksta: Često je potrebno dijeliti informacije o kontekstu između gatewaya i udaljenih servisa, kao što su tokeni za autentifikaciju ili ID-jevi korisnika. To se može postići prosljeđivanjem informacija o kontekstu kao dio procesa delegiranja upita.
- Obrada grešaka: Implementirajte robusnu obradu grešaka kako biste elegantno rukovali greškama koje se javljaju u udaljenim servisima. To može uključivati bilježenje grešaka, vraćanje korisnički prihvatljivih poruka o greškama ili ponovno pokušavanje neuspjelih zahtjeva.
Odabir između Schema Stitchinga i Apollo Federacije
Iako je Schema Stitching održiva opcija za GraphQL Federaciju, Apollo Federacija je postala popularniji izbor zbog svojih naprednih značajki i poboljšanog iskustva za programere. Evo usporedbe ova dva pristupa:
Značajka | Schema Stitching | Apollo Federation |
---|---|---|
Definicija sheme | Koristi postojeći GraphQL jezik shema | Koristi deklarativni jezik shema s direktivama |
Planiranje upita | Zahtijeva ručno delegiranje upita | Automatsko planiranje upita od strane Apollo Gatewaya |
Proširenja tipova | Ograničena podrška | Ugrađena podrška za proširenja tipova |
Ključne direktive | Nije podržano | Koristi @key direktivu za identifikaciju entiteta |
Distribuirano praćenje | Zahtijeva ručnu implementaciju | Ugrađena podrška za distribuirano praćenje |
Alati i ekosustav | Manje zreli alati | Zreliji alati i velika zajednica |
Složenost | Može biti složeno za upravljanje u velikim sustavima | Dizajnirano za velike i složene sustave |
Kada odabrati Schema Stitching:
- Imate postojeće GraphQL servise i želite ih brzo kombinirati.
- Trebate jednostavno rješenje za federaciju i ne zahtijevate napredne značajke.
- Imate ograničene resurse i želite izbjeći dodatne troškove postavljanja Apollo Federacije.
Kada odabrati Apollo Federaciju:
- Gradite velik i složen sustav s više timova i servisa.
- Trebate napredne značajke poput proširenja tipova, ključnih direktiva i distribuiranog praćenja.
- Želite robusnije i skalabilnije rješenje za federaciju.
- Preferirate deklarativniji i automatiziraniji pristup federaciji.
Primjeri iz stvarnog svijeta i slučajevi upotrebe
Evo nekoliko primjera iz stvarnog svijeta kako se GraphQL Federacija, uključujući Schema Stitching, može koristiti:
- Platforma za e-trgovinu: Platforma za e-trgovinu može koristiti GraphQL Federaciju za kombiniranje podataka iz više servisa, kao što su servis za katalog proizvoda, servis za korisnike, servis za narudžbe i servis za plaćanje. To omogućuje klijentima da lako dohvate sve informacije potrebne za prikaz detalja o proizvodu, korisničkih profila, povijesti narudžbi i informacija o plaćanju.
- Platforma za društvene medije: Platforma za društvene medije mogla bi koristiti GraphQL Federaciju za kombiniranje podataka iz servisa koji upravljaju korisničkim profilima, objavama, komentarima i lajkovima. To omogućuje klijentima da učinkovito dohvate sve informacije potrebne za prikaz korisničkog profila, njegovih objava te komentara i lajkova povezanih s tim objavama.
- Aplikacija za financijske usluge: Aplikacija za financijske usluge može koristiti GraphQL Federaciju za kombiniranje podataka iz servisa koji upravljaju računima, transakcijama i investicijama. To omogućuje klijentima da lako dohvate sve informacije potrebne za prikaz stanja računa, povijesti transakcija i investicijskih portfelja.
- Sustav za upravljanje sadržajem (CMS): CMS može iskoristiti GraphQL Federaciju za integraciju podataka iz različitih izvora kao što su članci, slike, videozapisi i sadržaj generiran od strane korisnika. To omogućuje jedinstveni API za dohvaćanje svog sadržaja vezanog uz određenu temu ili autora.
- Aplikacija u zdravstvu: Integrirajte podatke o pacijentima iz različitih sustava kao što su elektronički zdravstveni kartoni (EHR), laboratorijski rezultati i zakazivanje termina. To liječnicima nudi jedinstvenu točku pristupa sveobuhvatnim informacijama o pacijentu.
Najbolje prakse za Schema Stitching
Kako biste osigurali uspješnu implementaciju Schema Stitchinga, slijedite ove najbolje prakse:
- Pažljivo planirajte svoju shemu: Prije nego što počnete spajati sheme, pažljivo isplanirajte strukturu jedinstvene sheme. This includes defining the relationships between types across different schemas, renaming types and fields to avoid conflicts, and considering the overall data access patterns.
- Koristite dosljedne konvencije imenovanja: Usvojite dosljedne konvencije imenovanja za tipove, polja i operacije u svim servisima. To će pomoći u izbjegavanju sukoba i olakšati razumijevanje jedinstvene sheme.
- Dokumentirajte svoju shemu: Temeljito dokumentirajte jedinstvenu shemu, uključujući opise tipova, polja i operacija. To će programerima olakšati razumijevanje i korištenje sheme.
- Pratite performanse: Pratite performanse gatewaya i udaljenih servisa kako biste identificirali i riješili bilo kakva uska grla u performansama. Koristite alate poput distribuiranog praćenja za praćenje zahtjeva kroz više servisa.
- Implementirajte sigurnost: Implementirajte odgovarajuće sigurnosne mjere za zaštitu gatewaya i udaljenih servisa od neovlaštenog pristupa. To može uključivati korištenje mehanizama za autentifikaciju i autorizaciju, kao i provjeru valjanosti ulaznih podataka i kodiranje izlaznih podataka.
- Verzionirajte svoju shemu: Kako razvijate svoje sheme, odgovarajuće ih verzionirajte kako biste osigurali da klijenti mogu nastaviti koristiti starije verzije sheme bez prekida. To će pomoći u izbjegavanju prijelomnih promjena i osigurati kompatibilnost unatrag.
- Automatizirajte postavljanje: Automatizirajte postavljanje gatewaya i udaljenih servisa kako biste osigurali da se promjene mogu brzo i pouzdano postaviti. To će pomoći u smanjenju rizika od grešaka i poboljšati ukupnu agilnost sustava.
Zaključak
GraphQL Federacija sa Schema Stitchingom nudi moćan pristup izgradnji jedinstvenih API-ja iz više servisa u arhitekturi mikroservisa. Razumijevanjem njezinih temeljnih koncepata, prednosti, ograničenja i tehnika implementacije, možete iskoristiti Schema Stitching za pojednostavljenje pristupa podacima, poboljšanje skalabilnosti i povećanje održivosti. Iako se Apollo Federacija pojavila kao naprednije rješenje, Schema Stitching ostaje održiva opcija za jednostavnije scenarije ili pri integraciji postojećih GraphQL servisa. Pažljivo razmotrite svoje specifične potrebe i zahtjeve kako biste odabrali najbolji pristup za svoju organizaciju.